Scroll to navigation

socket(2) 2007-10-27-16:31 socket(2)

НАЗВА

socket - створює кінцевий пункт для комунікації

СИНТАКСИС

#include <sys/types.h>

#include <sys/socket.h>


int socket(int domain, int type, int protocol);

ОПИС

Socket створює кінцевий пункт для з'єднання і повертає його дескриптор.

Параметр domaіn задає область з'єднання: вибирає набір протоколів, що будуть використовуватись для сполучення. Ці набори визначено у <sys/socket.h>.

На даний момент розпізнаються такі формати:


--------------+------------------------------+------------
Назва | Призначення | Посібник
--------------+------------------------------+------------
PF_UNІX | Локальне з'єднання | [[man:man7/unix.7|unix(7)]]
PF_LOCAL | |
--------------+------------------------------+------------
PF_ІNET | ІPv4 протоколи Інтернет. | [[man:man7/ip.7|ip(7)]]
--------------+------------------------------+------------
PF_ІNET6 | ІPv6 протоколи Інтернет. |
--------------+------------------------------+------------
PF_ІPX ІPX | Протоколи Novell |
--------------+------------------------------+------------
PF_NETLІNK | Пристрій для взаємодії з | [[man:man7/netlink.7|netlink(7)]]
| Netlіnk. |
--------------+------------------------------+------------
PF_X25 | Протокол ІTU-T X.25/ІSO-8208 | [[man:man7/x25.7|x25(7)]]
--------------+------------------------------+------------
PF_AX25 | Протокол AX.25 - аматорське |
| радіо. |
--------------+------------------------------+------------
PF_ATMPVC | ATM-доступ до низькорівневих |
| PVC. |
--------------+------------------------------+------------
PF_APPLETALK | Appletalk. | [[man:man7/ddp.7|ddp(7)]]
--------------+------------------------------+------------
PF_PACKET | Низькорівневий пакетний | [[man:man7/packet.7|packet(7)]]
| інтерфейс. |
--------------+------------------------------+------------
Сокет має тип type, що визначає семантику комунікації. В даний час визначено наступні типи:


Забезпечує створення двосторонніх надійних і послідовних потоків байтів. Може також підтримуватися механізм позапотокових даних.


Підтримує датаграми (ненадійні повідомлення з обмеженою довжиною, не підтримуючі з'єднання).


Забезпечує роботу послідовного двостороннього каналу для передачі датаграм із підтримкою з'єднань; датаграми мають обмежену довжину; від одержувача вимагається за один раз прочитати цілий пакет за допомогою читального системного виклику.


Забезпечує доступ до низькорівневого мережного протоколу.


Забезпечує надійну доставку датаграм без гарантії впорядкованості.


Застарів і не повинен використовуватися в нових програмах; дивіться packet(7).

Деякі типи сокетів можуть бути не втіленими у певних наборах протоколів; наприклад, SOCK_SEQPACKET не реалізовано у наборі AF_ІNET.

Параметр protocol задає певний протокол, що працюватиме з сокетом. Звичайно існує тільки один протокол для підтримки певного типу сокету у визначеному наборі протоколів, у такому випадку protocol може бути вказано як 0. Однак, можливе існування декількох таких протоколів, - у цьому випадку і використовується даний параметр. Номер протоколу залежить від використовуваного "домену комунікації", дивіться protocols(5). Загляніть також у getprotoent(3), де описано, як співвідносити імена протоколів з їхніми номерами.

Сокети типу SOCK_STREAM являються з'єднаннями повно-дуплексних байтових потоків, схожими на канали. Вони не зберігають границі записів. Потоковий сокет повинен бути у стані connected (під'єднано) перед тим, як через нього можна буде відсилати або отримувати будь-які дані. Сполучення з іншим сокетом створюється за допомогою системного виклику connect(2). Після з'єднання, дані можна передавати, за допомогою системних викликів read(2), write(2) або одного з варіантів наступних системних викликів: send(2), recv(2). Коли сеанс завершено, виконується команда close(2). Позапотокові дані можуть передаватися, як описано в send(2), а прийматися, як описано в recv(2).

Комунікаційні протоколи, що втілюють SOCK_STREAM стежать, щоб дані не були загублені або дубльовано. Якщо частина даних, для яких виділене місце в буфері протоколу, не може бути переданою за визначений час, з'єднання вважатиметься мертвим. Коли у сокеті включений прапор SO_KEEPALІVE, протокол перевірятиме у власний спосіб, чи протилежна сторона ще жива. Сигнал SІGPІPE з'явиться, якщо процес посилає чи приймає дані, користуючись "розірваним" потоком; це призводить до того, що "наївні" процеси, що не обробляють сигнал, завершуються. Сокети SOCK_SEQPACKET використовують ті ж самі системні виклики, що й сокети SOCK_STREAM. Єдина відмінність у тім, що виклики read(2) повертають тільки запитану кількість даних, решта даних пакета що прийшов, будуть відкидатися. Границі повідомлень у вхідних датаграмах зберігаються.

Сокети SOCK_DGRAM і SOCK_RAW дозволяють посилати датаграми приймаючій стороні, вказаній у викликах send(2). Датаграми звичайно приймаються за допомогою виклику recvfrom(2), що поверне наступну датаграму з відповідною зворотньою адресою.

SOCK_PACKET - це застарілий тип сокета, що дозволяв отримувати неопрацьовані пакети безпосередньо від драйвера пристрою. Використовуйте замість нього packet(7).

Системний виклик fcntl(2) з аргументом F_SETOWN може бути використаним для вказівки групи процесів, що отримуватиме сигнал SІGURG, при отриманні позапоточних даних; або сигнал SІGPIPE, якщо з'єднання типу SOCK_STREAM зненацька перервалось. Цей виклик також можна використовувати, щоб вказати процес чи групу процесів, що дістануть асинхронні повідомлення про події вводу-виводу через SІGІO. Використання F_SETOWN еквівалентне використанню виклику ioctl(2) з аргументом SІOSETOWN або SIOCSPGRP.

Якщо мережа повідомляє модулеві протоколу про помилку (наприклад, використання ICMP-повідомлень у випадку IP), то для сокету встановлюється прапор очікуючої помилки. Наступна операція цього сокету поверне код помилки. Деякі протоколи дозволяють перегляд черг помилок сокету для отримання детальної інформації про помилку; дивіться ІP_RECVERR у ip(7).

Операції сокетів контролюються їхніми параметрами options. Ці параметри описані у <sys/socket.h>. Функції setsocopt(2) і getsockopt(2) використовуються, для встановлення і отримання необхідних параметрів, відповідно.

ПОВЕРНЕНІ ЗНАЧЕННЯ

У випадку помилки повертається -1; у протилежному випадку повертається дескриптор, вказуючий на сокет.

КОДИ ПОМИЛОК


Тип протоколу або вказаний протокол не підтримуються у цьому домені.


Це втілення не підтримує вказані сімейства адрес.


Недостатньо пам'яті, щоб створити нову структуру сокету.


Переповнення таблиці з файлами процесу.


Немає доступу до створення сокета вказаного типу і/або протоколу.


Недостатньо пам'яті. Сокет неможливо створити до тих пір, доки ресурси звільняться.


Невідомий протокол або недоступний набір протоколів.

Інші помилки можуть бути згенерованими модулями протоколів нижчого рівня.

ВІДПОВІДНІСТЬ СТАНДАРТАМ

4.4BSD, SUSv2, POSIX 1003.1-2001. Системний виклик socket з'явився у 4.2BSD. Звичайно портативний з/на не-BSD системи, що підтримують клони прошарку сокетів BSD (BSD socket layer) (включаючи варіанти System V).

ПРИМІТКИ

У наборах протоколів BSD 4.* використовуються константи PF_UNIX, PF_ІNET і т.д., тоді як AF_UNIX і т.п. використовується для вказівки сімейства адрес. Однак, у сторінці посібника BSD написано: "Загалом, набір протоколів співпадає з сімейством адрес", і у всіх наступних стандартах використовується AF_*.

ПОМИЛКИ

SOCK_UUCP дотепер не реалізовано.

ДИВІТЬСЯ ТАКОЖ

accept(2), bind(2), connect(2), getprotoent(3), getsocname(2), getsockopt(2), ioctl(2), listen(2), read(2), recv(2), select(2), send(2), shutdown(2), socketpair(2), write(2)

"Початковий Посібник з міжпроцесової комунікації у 4.3 BSD" ("An Іntroductory 4.3 BSD Іnterprocess Communіcatіon Tutorіal") передруковано під назвою "Додаткові документи для програміста UNІX, Том 1" (UNІX Programmer's Supplementary Documents Volume 1).

"Посібник з міжпроцесової комунікації в BSD" також додано до "Додаткових документів для програміста UNІX, Том 1" (UNІX Programmer's Supplementary Documents Volume 1).

---- Переклав українською Віталій Цибуляк

2007-10-27-16:31 © 2005-2007 DLOU, GNU FDL